package DataControl;

import Data.*;

import java.util.Iterator;
import java.util.List;

/**
 * 服务器数据发送器
 */
public class ServerDataSender implements IServerDataSender { // 实现接口
    public DataPort ServerData;//数据接口

    private int BlockSize=99999999;//一次发送多少个数据块
    private List<FileData> WaitingDownFileQueue=new java.util.ArrayList<>();//待下载队列

    public ServerDataSender() {}

    @Override
    public DataPort getFolderData(String Path){
        System.out.println("服务器数据发送器：获取"+Path+"文件夹内容");
        ServerData= new FolderData(Path);
        return ServerData;
    }

    @Override
    public void setDownloadFile(String filePath) {
        FileData fileData = new FileData(filePath);//创建路径文件数据对象
        WaitingDownFileQueue.add(fileData); // 将文件数据加入待下载队列
        System.out.println("服务器数据发送器：加入文件到待下载队列成功");
    }

    @Override
    public DataPort getFileData(String filePath) {
        int InQueue=0;
        FileData fileData = new FileData(filePath);
        //判断是否在待下载队列中
        for (int i = 0; i < WaitingDownFileQueue.size(); i++){
            String WaitDownPath=WaitingDownFileQueue.get(i).getFileInfo().getPath();//获取待下载队列中指定index的文件路径
            if (WaitDownPath.equals(filePath)) {
                fileData=WaitingDownFileQueue.get(i);
                InQueue=1;
                break;
            }
        }
        //判断是否在待下载队列中,不在，就加入到待下载队列
        if (InQueue==0){
            System.out.println("服务器数据发送器：待下载队列中文件数据不存在，将文件加入待下载队列:"+filePath);
            setDownloadFile(filePath);
            System.out.println("服务器数据发送器：加入文件数据到待下载队列："+filePath);
        }
        //从整个文件数据中获取部分数据
        // 判断该文件数据是否已经下载完成
        if (!fileData.NowDataIsCompleted()) {
            //文件未完成下载
            System.out.println("服务器数据发送器：待下载队列中文件数据存在，执行数据块装箱");
            List<BlockData> blockData = fileData.getNowData(BlockSize); // 获取现在的索引的文件数据
            FileData nowFileData = new FileData(fileData, blockData); // 创建一个只有必要数据块的文件数据对象
            fileData.NowDataIsCompleted(BlockSize);
            System.out.println("服务器数据发送器：装箱完毕，返回装箱数据:" + nowFileData);
            return nowFileData;
        } else {
            //文件完成下载
            System.out.println("服务器数据发送器：文件数据下载完成");
            removeFileData(fileData.getFileInfo().getPath());
            return null; // 或者抛出异常，根据具体需求决定
        }
    }

    @Override
    public DataPort getFileData(String filePath,int[] Indexs){
        int InQueue=0;
        FileData fileData = new FileData();
        //判断是否在待下载队列中
        for (int i = 0; i < WaitingDownFileQueue.size(); i++){
            String WaitDownPath=WaitingDownFileQueue.get(i).getFileInfo().getPath();//获取待下载队列中指定index的文件路径
            if (WaitDownPath.equals(filePath)) {
                fileData=WaitingDownFileQueue.get(i);
                InQueue=1;
                break;
            }
        }
        //判断是否在待下载队列中,不在，就加入到待下载队列
        if (InQueue==0){
            System.out.println("服务器数据发送器：待下载队列中文件数据不存在，将文件加入待下载队列:"+filePath);
            setDownloadFile(filePath);
            System.out.println("服务器数据发送器：加入文件数据到待下载队列："+filePath);
        }
        //从整个文件数据中获取部分数据
        // 判断该文件数据是否已经下载完成
        if (fileData.NowDataIsCompleted(BlockSize)) {
            System.out.println("服务器数据发送器：待下载队列中文件数据存在，执行数据块装箱");
            List<BlockData> blockData = fileData.getIndexsData(Indexs); // 获取现在的索引的文件数据
            FileData nowFileData = new FileData(fileData, blockData); // 创建一个只有必要数据块的文件数据对象
            System.out.println("服务器数据发送器：装箱完毕，返回装箱数据:" + nowFileData);
            return nowFileData;
        } else {
            System.out.println("服务器数据发送器：文件数据未完成下载，等待下次请求");
            return null; // 或者抛出异常，根据具体需求决定
        }
    }

    @Override
    public void removeFileData(String fileName){
        Iterator<FileData> iterator = WaitingDownFileQueue.iterator();
        while (iterator.hasNext()) {
            FileData fileData = iterator.next();
            if (fileData.getName().equals(fileName)) {
                iterator.remove();
                System.out.println("文件 " + fileName + " 已从待下载队列中移除。");
                return;
            }
        }
    }

    @Override
    public void FileIsCompleted(int fileIndex){
        FileData fileData=WaitingDownFileQueue.get(fileIndex);//从待下载队列中获取指定的index的完整的文件数据
        fileData.NowDataIsCompleted(BlockSize);
    }
}